# -*- coding: utf-8 -*-
"""
路径管理模块 - 处理打包后的路径问题
"""
import os
import sys
from typing import Optional

def get_app_data_dir() -> str:
    """
    获取应用程序数据目录
    在开发环境中返回项目根目录下的data文件夹
    在打包环境中返回用户目录下的应用数据文件夹
    """
    if is_frozen():
        # 打包后的环境
        # 使用用户目录下的应用数据文件夹
        app_data_dir = os.path.join(
            os.path.expanduser("~"), 
            "AppData", 
            "Local", 
            "MySQL数据库字典导出工具"
        )
    else:
        # 开发环境
        # 使用项目根目录下的data文件夹
        app_data_dir = os.path.join(
            os.path.dirname(os.path.dirname(__file__)), 
            "data"
        )
    
    # 确保目录存在
    os.makedirs(app_data_dir, exist_ok=True)
    return app_data_dir

def get_logs_dir() -> str:
    """
    获取日志目录
    """
    if is_frozen():
        # 打包后的环境
        logs_dir = os.path.join(
            os.path.expanduser("~"), 
            "AppData", 
            "Local", 
            "MySQL数据库字典导出工具", 
            "logs"
        )
    else:
        # 开发环境
        logs_dir = os.path.join(
            os.path.dirname(os.path.dirname(__file__)), 
            "logs"
        )
    
    # 确保目录存在
    os.makedirs(logs_dir, exist_ok=True)
    return logs_dir

def get_user_settings_file() -> str:
    """
    获取用户设置文件路径
    """
    return os.path.join(get_app_data_dir(), "user_settings.json")

def get_database_file() -> str:
    """
    获取数据库文件路径
    """
    return os.path.join(get_app_data_dir(), "app_data.db")

def get_resource_path(relative_path: str) -> str:
    """
    获取资源文件路径
    在开发环境中返回项目根目录下的相对路径
    在打包环境中返回临时目录下的资源路径
    """
    if is_frozen():
        # 打包后的环境
        # PyInstaller会将资源文件放在临时目录中
        base_path = sys._MEIPASS
    else:
        # 开发环境
        base_path = os.path.dirname(os.path.dirname(__file__))
    
    return os.path.join(base_path, relative_path)

def is_frozen() -> bool:
    """
    检查是否在打包环境中运行
    """
    return getattr(sys, 'frozen', False)

def get_executable_dir() -> str:
    """
    获取可执行文件所在目录
    """
    if is_frozen():
        return os.path.dirname(sys.executable)
    else:
        return os.path.dirname(os.path.dirname(__file__))

def ensure_dir_exists(dir_path: str) -> None:
    """
    确保目录存在，如果不存在则创建
    """
    os.makedirs(dir_path, exist_ok=True)

def get_desktop_path() -> str:
    """
    获取桌面路径
    """
    return os.path.join(os.path.expanduser("~"), "Desktop")

def get_documents_path() -> str:
    """
    获取文档路径
    """
    return os.path.join(os.path.expanduser("~"), "Documents")

def get_downloads_path() -> str:
    """
    获取下载路径
    """
    return os.path.join(os.path.expanduser("~"), "Downloads")

def get_temp_path() -> str:
    """
    获取临时路径
    """
    import tempfile
    return tempfile.gettempdir()

def normalize_path(path: str) -> str:
    """
    标准化路径，处理相对路径和绝对路径
    """
    if os.path.isabs(path):
        return path
    else:
        return os.path.abspath(path)

def is_valid_path(path: str) -> bool:
    """
    检查路径是否有效
    """
    try:
        # 尝试规范化路径
        os.path.normpath(path)
        return True
    except (OSError, ValueError):
        return False

def get_file_size(path: str) -> Optional[int]:
    """
    获取文件大小，如果文件不存在返回None
    """
    try:
        if os.path.exists(path):
            return os.path.getsize(path)
        return None
    except OSError:
        return None

def get_dir_size(dir_path: str) -> int:
    """
    获取目录大小
    """
    total_size = 0
    try:
        for dirpath, dirnames, filenames in os.walk(dir_path):
            for filename in filenames:
                filepath = os.path.join(dirpath, filename)
                try:
                    total_size += os.path.getsize(filepath)
                except OSError:
                    pass
    except OSError:
        pass
    return total_size

def clean_old_files(dir_path: str, max_age_days: int = 30) -> int:
    """
    清理指定目录中的旧文件
    返回清理的文件数量
    """
    import time
    current_time = time.time()
    max_age_seconds = max_age_days * 24 * 60 * 60
    cleaned_count = 0
    
    try:
        for dirpath, dirnames, filenames in os.walk(dir_path):
            for filename in filenames:
                filepath = os.path.join(dirpath, filename)
                try:
                    file_age = current_time - os.path.getmtime(filepath)
                    if file_age > max_age_seconds:
                        os.remove(filepath)
                        cleaned_count += 1
                except OSError:
                    pass
    except OSError:
        pass
    
    return cleaned_count
